package tecnicas;

import java.util.ArrayList;

import datosFamilias.*;
import matriz.Matriz;

public abstract class TecnicaAbstracta 
{
    protected int numeroDeTecnica;
    protected int cantidadDeCriterios;
    protected static ArrayList<Float> priorizacionCriterios = null;
    
    public abstract ArrayList<Familia> calcularResultados();
    
    // METODOS PARA GUARDAR LA PRIORIZACION DE CRITERIOS
    protected static void cargarPriorizacionCriterios(ArrayList<String> valoresMatriz, int cantCriterios)
    {
        priorizacionCriterios = (cargarMatriz(valoresMatriz, cantCriterios)).obtenerVectorPrioridad();
    }
    
    // Carga la matriz con los valores de la interfaz grafica
    private static Matriz cargarMatriz(ArrayList<String> valoresMatriz, int tamanio)
    {
        Matriz criterios = new Matriz(tamanio, tamanio);
        for(int index = 0; index < valoresMatriz.size(); index++)
        {
            switch(valoresMatriz.get(index))
            {
                case "1/9": criterios.agregarValor(obtenerColumna(index), obtenerFila(index), 9f); break;
                case "1/8": criterios.agregarValor(obtenerColumna(index), obtenerFila(index), 8f); break;
                case "1/7": criterios.agregarValor(obtenerColumna(index), obtenerFila(index), 7f); break;
                case "1/6": criterios.agregarValor(obtenerColumna(index), obtenerFila(index), 6f); break;
                case "1/5": criterios.agregarValor(obtenerColumna(index), obtenerFila(index), 5f); break;
                case "1/4": criterios.agregarValor(obtenerColumna(index), obtenerFila(index), 4f); break;
                case "1/3": criterios.agregarValor(obtenerColumna(index), obtenerFila(index), 3f); break;
                case "1/2": criterios.agregarValor(obtenerColumna(index), obtenerFila(index), 2f); break;
                case "1": criterios.agregarValor(obtenerFila(index), obtenerColumna(index), 1f); break;
                case "2": criterios.agregarValor(obtenerFila(index), obtenerColumna(index), 2f); break;
                case "3": criterios.agregarValor(obtenerFila(index), obtenerColumna(index), 3f); break;
                case "4": criterios.agregarValor(obtenerFila(index), obtenerColumna(index), 4f); break;
                case "5": criterios.agregarValor(obtenerFila(index), obtenerColumna(index), 5f); break;
                case "6": criterios.agregarValor(obtenerFila(index), obtenerColumna(index), 6f); break;
                case "7": criterios.agregarValor(obtenerFila(index), obtenerColumna(index), 7f); break;
                case "8": criterios.agregarValor(obtenerFila(index), obtenerColumna(index), 8f); break;
                case "9": criterios.agregarValor(obtenerFila(index), obtenerColumna(index), 9f); break;
            }
        }
        return criterios;
    }
    
    private static int obtenerColumna(int valor)
    {
        if(valor == 0 || valor == 1 || valor == 3 || valor == 6 || valor == 10)
            return 0;
        if(valor == 2 || valor == 4 || valor == 7 || valor == 11)
            return 1;
        if(valor == 5 || valor == 8 || valor == 12)
            return 2;
        if(valor == 9 || valor == 13)
            return 3;
        if(valor == 14)
            return 4;
        return -1;
    }
    
    private static int obtenerFila(int valor)
    {
        if(valor == 0)
            return 1;
        if(valor == 1 || valor == 2)
            return 2;
        if(valor == 3 || valor == 4 || valor == 5)
            return 3;
        if(valor == 6 || valor == 7 || valor == 8 || valor == 9)
            return 4;
        if(valor == 10 || valor == 11 || valor == 12 || valor == 13 || valor == 14)
            return 5;
        return -1;
    }
}